package gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JScrollPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.JButton;
import javax.swing.JList;

import bean.ConnexionEJB;
import service.Fichier;
import service.Fichier_Avec_Chemin;
import socket.ThreadSocketGetFile;


public class FenetrePrincipale extends JFrame implements WindowListener {
	// ATTRIBUTS
	private JPanel contentPane;
	private JTree tree;
	private JList<Fichier> list;
	private DefaultMutableTreeNode racine;
	private List<Fichier_Avec_Chemin> fichiersPartages;
	private File dossierPartage;
	private JLabel lblC;
	private FenetrePrincipale current;
	
	
	// CONSTRUCTEURS
	public FenetrePrincipale(List<Fichier_Avec_Chemin> fichiersPartages) {
		this.fichiersPartages = fichiersPartages;
		
		addWindowListener(this); 
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 610, 453);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		lblC = new JLabel(System.getProperty("user.home") + "\\desktop");
		
		JLabel lblBienvenueSurEjb = new JLabel("Bienvenue sur File Sharing - EJB");
		contentPane.add(lblBienvenueSurEjb, BorderLayout.NORTH);
		
		JPanel panel = new JPanel();
		panel.setBorder(new EmptyBorder(15, 0, 0, 0));
		contentPane.add(panel, BorderLayout.CENTER);
		panel.setLayout(new GridLayout(1, 2, 0, 0));
		
		JPanel panel_1 = new JPanel();
		panel_1.setBorder(new EmptyBorder(0, 0, 0, 5));
		panel.add(panel_1);
		panel_1.setLayout(new BorderLayout(0, 0));
		
		JPanel panel_3 = new JPanel();
		panel_1.add(panel_3, BorderLayout.NORTH);
		panel_3.setLayout(new GridLayout(0, 2, 0, 0));
		
		JButton btnNewButton = new JButton("Rafraichir");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
			
				System.out.println("FenetrePrincipale - On entre dans l'event Rafraichir");
				remplirJList((List<Fichier>) ConnexionEJB.noeud.getAllFichiersClient());
			}
		});
		panel_3.add(btnNewButton);
		
		JButton btnNewButton_1 = new JButton("T\u00E9l\u00E9charger");
		current = this;
		btnNewButton_1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				// On recupere les infos concernant le fichier selectionne et le repertoire de destination
				File dossierDest = new File(lblC.getText());
				
				if(dossierDest.exists() && dossierDest.isDirectory()) {
					for(Object item : list.getSelectedValuesList()) {
						Fichier fichier = (Fichier) item;
						String[] adresse_ip_port = ConnexionEJB.noeud.getFichierClient(fichier.getMd5());
						String ip = adresse_ip_port[0];
						int port = Integer.parseInt(adresse_ip_port[1]);
						//String ip = "127.0.0.1";
						System.out.println("FenetrePrincipale - IP du noeud possédant le fichier : " + ip + ":" + port);
						if (ip != null) { 
							(new ThreadSocketGetFile(dossierDest, fichier, ip, port, current)).start();
						}
					}
				}
				
				remplirJList((List<Fichier>) ConnexionEJB.noeud.getAllFichiersClient());
			}
		});
		panel_3.add(btnNewButton_1);
		
		list = new JList<Fichier>();
		list.setBorder(new EmptyBorder(5, 5, 5, 5));
		panel_1.add(list, BorderLayout.CENTER);
		
		JPanel panel_2 = new JPanel();
		panel_2.setBorder(new EmptyBorder(0, 5, 0, 0));
		panel.add(panel_2);
		panel_2.setLayout(new BorderLayout(0, 0));
		
		JPanel panel_4 = new JPanel();
		panel_2.add(panel_4, BorderLayout.SOUTH);
		panel_4.setLayout(new GridLayout(2, 0, 0, 0));
		
		JPanel panel_5 = new JPanel();
		panel_4.add(panel_5);
		panel_5.setLayout(new GridLayout(1, 2, 0, 0));
		
		JLabel lblDossierDeRception = new JLabel("Dossier de r\u00E9ception");
		panel_5.add(lblDossierDeRception);
		
		JButton btnParcourir = new JButton("Parcourir");
		btnParcourir.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				File dossier = ouvrir();
				
				if (dossier != null && dossier.exists())
					lblC.setText(dossier.getAbsolutePath());
			}
		});
		panel_5.add(btnParcourir);
		
		panel_4.add(lblC);
		
		JScrollPane scrollPane = new JScrollPane();
		panel_2.add(scrollPane, BorderLayout.CENTER);
		
		tree = new JTree();
		scrollPane.setViewportView(tree);
		
		JPanel panel_6 = new JPanel();
		panel_2.add(panel_6, BorderLayout.NORTH);
		panel_6.setLayout(new GridLayout(1, 2, 0, 0));
		
		JButton btnNewButton_2 = new JButton("Sélectionner répertoire de partage");
		btnNewButton_2.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				dossierPartage = ouvrir();
				majJTree();
			}
		});
		panel_6.add(btnNewButton_2);
		
		JButton btnNewButton_3 = new JButton("Supprimer");
		btnNewButton_3.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				try {
					String nomFichier = tree.getSelectionPath().getLastPathComponent().toString();
					
					if (ConnexionEJB.noeud.supprimerFichier(nomFichier)) {
						((DefaultTreeModel) tree.getModel()).removeNodeFromParent((MutableTreeNode) tree.getSelectionPath().getLastPathComponent());
						System.out.println("FenetrePrincipale - Noeud supprimé.");
					}
					else {
						System.out.println("FenetrePrincipale - Noeud non supprimé.");
					}
				}
				catch (Exception e1) { System.err.println("FenetrePrincipale - Erreur : " + e1.getMessage()); }
			}
		});
		panel_6.add(btnNewButton_3);
	}
	
	private File ouvrir() {
		JFileChooser jc = new JFileChooser();
		jc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		int i = jc.showDialog(this, "Sélectionner");
		
		if(i != 1) {
			return jc.getSelectedFile();
		}
		else {
			return null;
		}
	}
	
	private void remplirJList(List<Fichier> fichiersDistants) {
		DefaultListModel model = new DefaultListModel();
		
		for (Fichier tmpFichier : fichiersDistants) {
			System.out.println("FenetrePrincipale.remplirJList - Fichier : " + tmpFichier.getNomFichier() + "\nMD5 : " + tmpFichier.getMd5());
			model.addElement(tmpFichier);
		}
		
		list.setModel(model);
		list.updateUI();
	}
	
	private void remplirJTree(File dossier) {
		// On efface l'ancienne liste de fichiers partages
		fichiersPartages.clear();
		racine = new DefaultMutableTreeNode();
		
		for(File file : dossier.listFiles()) {
			String fileName = file.getName();
			DefaultMutableTreeNode noeudTree = new DefaultMutableTreeNode(fileName);
			
			try {
				if(file.isDirectory()) {
					for(File nom : file.listFiles()){
						DefaultMutableTreeNode node = new DefaultMutableTreeNode(nom.getName() + "\\");
						noeudTree.add(listFile(nom, node));
					}
				}
				else {
					// Si c'est un fichier, on l'ajoute a la liste
					//fichiersPartages.put(getMD5(file), file);
					fichiersPartages.add(new Fichier_Avec_Chemin(file.getAbsolutePath()));
				}
			}
			catch(Exception e) { System.err.println("\tFenetrePrincipale.remplirJTree - Erreur : " + e.getMessage()); }
			
			racine.add(noeudTree);
		}
		
		tree.setModel(new DefaultTreeModel(racine));
		tree.updateUI();
	}
	
	private DefaultMutableTreeNode listFile(File file, DefaultMutableTreeNode node) {
		if(file.isFile()) {
			// Si c'est un fichier, on l'ajoute a la liste
			//fichiersPartages.put(getMD5(file), file);
			Fichier_Avec_Chemin fichier = new Fichier_Avec_Chemin(file.getAbsolutePath());
			fichiersPartages.add(fichier);
			return new DefaultMutableTreeNode(fichier);
		}
		else {
			for (File nom : file.listFiles()) {
				DefaultMutableTreeNode subNode;
				
				if (nom.isDirectory()) {
					subNode = new DefaultMutableTreeNode(nom.getName() + "\\");
					node.add(listFile(nom, subNode));
				}
				else {
					subNode = new DefaultMutableTreeNode(nom.getName());
				}
 
				node.add(subNode);
			}
			
			return node;
		}
	}
	
	public void majJTree() {
		
		if (dossierPartage != null && dossierPartage.exists()) {
			// On remplit le JTree ET on liste les fichiers dans la hashmap avec le md5 correspondant comme key
			remplirJTree(dossierPartage);
			majServeurFichiersPartages();
			lblC.setText(dossierPartage.getAbsolutePath());
		}
	}
	
	private void majServeurFichiersPartages() {
		// On envoie la liste de fichiers sur le noeud_bean
		List<Fichier> listePourNoeudBean = new ArrayList<Fichier>();
		
		for (Fichier tmpFichier : fichiersPartages) {
			//System.out.println("Fichier : " + tmpFichier.getNomFichier() + "\nMD5 : " + tmpFichier.getMd5());
			listePourNoeudBean.add(tmpFichier);
		}
		
		//System.out.println(ConnexionEJB.noeud.heartBeat());
		ConnexionEJB.noeud.setListeFichiers(listePourNoeudBean);
	}

	@Override
	public void windowActivated(WindowEvent arg0) {}

	@Override
	public void windowClosed(WindowEvent arg0) {}

	@Override
	public void windowClosing(WindowEvent arg0) {
		ConnexionEJB.serveur_central.deconnexion(ConnexionEJB.noeud);
		System.exit(0);
	}

	@Override
	public void windowDeactivated(WindowEvent arg0) {}

	@Override
	public void windowDeiconified(WindowEvent arg0) {}

	@Override
	public void windowIconified(WindowEvent arg0) {}

	@Override
	public void windowOpened(WindowEvent arg0) {}
}
